DEFINITION MODULE strEditor;  (* Andy 09-Jul-89. (c) KRONOS *)
                              (* Ned  05-Oct-89. (c) KRONOS *)
                              (* Leo  08-Nov-89. (c) KRONOS *)
                              (* Andy 06-Jan-90. (c) KRONOS *)

(* Модуль поставляет процедуры редактирования строки *)

TYPE
  LINE_BUFFER;

  VALID = PROCEDURE (VAR CHAR): BOOLEAN;
   READ = PROCEDURE (VAR CHAR);
   BELL = PROCEDURE (INTEGER);

  descriptor = POINTER TO desc_rec;
    desc_rec = RECORD
                   buf : LINE_BUFFER;
                   last: CHAR;     -- последний символ
                  valid: VALID;    -- фильтр вводимых символов
                   ins : BOOLEAN;  -- режим вставки
                   bel : BOOLEAN;  -- режим звукового сигнала при ошибках
                   how : BITSET;   -- режим показа строки
                   read: READ;     -- процедура чтения символа
                   bell: BELL;     -- процедура подачи сигнала
                                   -- при ошибке редактирования
               END;

CONST -- display flags
      _empty   = 0;
      _bol     = 1;
      _refresh = 2;

CONST -- how:
      empty   = {_empty,_refresh};
      show    =        {_refresh,_bol};
      confirm =        {_refresh};

PROCEDURE read_str(    prompt: ARRAY OF CHAR;
                   VAR string: ARRAY OF CHAR;
                          dsc: descriptor;
              SEQ terminators: CHAR);

PROCEDURE edit_str(    prompt: ARRAY OF CHAR;
                   VAR string: ARRAY OF CHAR;
               line,col1,col2: INTEGER;
                          dsc: descriptor;
              SEQ terminators: CHAR);

PROCEDURE new    (VAR desc: descriptor; no_lines: INTEGER);
PROCEDURE dispose(VAR desc: descriptor);

PROCEDURE set_prefix(desc: descriptor; prefix: ARRAY OF CHAR;
                                     VAR done: BOOLEAN);

(*************************************************************

       Модуль поставляет процедуры редактирования строки.
       =================================================
         Ввод   осуществляется  процедурой read, содержащейся
                в дескрипторе редактора.
         Вывод  осуществляется  через  модуль Terminal.

         Каждый введенный символ проверяется на допустимость
         и, возможно, изменяется фильтром типа VALID,
         содержащимся в дескрипторе редактора.
         При valid(symbol)=TRUE возвращенный фильтром символ
         интерпретируется редактором, иначе он игнорируется.

         Флаги, управляющие показом строки
         в начале редактирования:

  _empty   - строка считается пустой
  _refresh - перед началом редактирования
             строка перерисовывается
  _bol     - курсор ставится в начало, а не в конец строки

         Режимы показа строки в начале редактирования

  empty    - строка считается пустой и показывается
  show     - показывает строку, курсор в начале строки
  confirm  - показывает строку, курсор в конце строки

PROCEDURE new(VAR desc: descriptor; n: INTEGER);
-------------
Генерация нового дескриптора с буфером на n строк
Все строки буфера инициализируются пустой строкой
ins=TRUE, bel=TRUE, how=empty, valid=std_valid,
read=Keyboard.read, bell=Keyboard.bell
При нехватке памяти возвращает NIL

  Стандартный фильтр std_valid допускает символ, если он
  является либо функциональным символом редактора (см. ниже),
  либо не контрольным символом.

PROCEDURE dispose(VAR desc: descriptor);
-----------------

PROCEDURE set_prefix(desc: descriptor; prefix: ARRAY OF CHAR;
--------------------                 VAR done: BOOLEAN);
 Строка -prefix- привязывается к дескриптору -desc-.
При следующем вызове редактора с этим дескриптором
строка будет проинтерпретирована, как если бы она
была прочитана символ за символом процедурой read.
 После окончания сеанса редактирования строка уничтожается.
 done = TRUE, если строку удалось привязать;
      = FALSE при нехватке памяти.

------------------------------------------------------------
 Набор функциональных символов редактора:

 Keyboard.cr,
 ASCII.NL
 и любой символ
 из последовательности
 -terminators-      : конец редактирования;
                      полученная строка помещается в буфер,
                      если она не пуста и не равна
                      последней помещенной в буфер строке;
                      символ-терминатор записывается
                      в дескриптор редактора
 Keyboard.lf        : аналогично Keyboard.cr,
                      но предварительно уничтожается хвост
                      строки справа от курсора
 Keyboard.f1        : если следующий прочитанный символ
                         допускается фильтром редактора
                         и равен одному из символов:
                         Keyboard.back или Keyboard.del,
                         то выполняется такое же действие,
                         что и в текстовом редакторе "ex",
                      иначе символ игнорируется
 Keyboard.f2        : если следующий прочитанный символ
                         допускается фильтром редактора
                         и равен одному из символов:
                         Keyboard.left, Keyboard.right,
                         Keyboard.back или Keyboard.del,
                         то выполняется такое же действие,
                         что и в текстовом редакторе "ex",
                      иначе символ игнорируется
 Keyboard.f4        : уничтожение всей строки
 Keyboard.f8        : уничтожение хвоста строки
                      справа от курсора
 Keyboard.tab       : табуляция вправо
 Keyboard.bcktab    : табуляция влево
 ^W                 : начало первого слова справа от курсора
                      подтягивается в текущую позицию
 ^D                 : начало первого слова строки
                      подтягивается в текущую позицию
 Keyboard.left      : курсор влево  на один символ
 Keyboard.right     : курсор вправо на один символ
 Keyboard.back      : уничтожение символа слева от курсора
 Keyboard.ins       : вставка пробела в текущую позицию
 Keyboard.del       : уничтожение символа в текущей позиции
 Keyboard.home      : курсор на начало строки
 Keyboard.end       : курсор в конец строки
 Keyboard.rep       : смена режима вставки/замены символа
 ASCII.BEL (^G)     : смена режима звукового сигнала
                      в случае ошибки
 Keyboard.up        : текущая позиция в буфере строк
                      увеличивается на 1, если это возможно;
                      в строку копируется текущий
                      элемент буфера
 Keyboard.dw        : текущая позиция в буфере строк
                      уменьшается на 1, если это возможно;
                      в строку копируется текущий
                      элемент буфера
 Keyboard.f7        : в хвост строки справа от курсора
                      копируется соответствующий хвост
                      (текущего+1) элемента буфера

 специальные возможности для ввода символов:
 ASCII.DC2 (^R)     : в строку помещается байт, значение
                      которого вводится в виде
                      ровно трех восьмеричных цифр;
                      байт фильтром не обрабатывается
 ASCII.DC4 (^T)     : в строку помещается байт, прочитанный
                      напрямую, без обработки фильтром редактора
------------------------------------------------------------

PROCEDURE read_str(    prompt: ARRAY OF CHAR;
------------------ VAR string: ARRAY OF CHAR;
                          dsc: descriptor;
              SEQ terminators: CHAR);
Если dsc=NIL, то используется некоторый дескриптор по умолчанию

Редактирование производится в однострочной области
от позиции курсора в начале редактирования (после вывода
строки -prompt-) до конца экрана.
Для корректной работы длина редактируемой строки не должна
превышать размера области.

PROCEDURE edit_str(    prompt: ARRAY OF CHAR;
------------------ VAR string: ARRAY OF CHAR;
               line,col1,col2: INTEGER;
                          dsc: descriptor;
              SEQ terminators: CHAR);
Если dsc=NIL, то используется некоторый дескриптор по умолчанию

Редактирование производится в однострочной области экрана:
строка -line-, колонки с -col1- включительно по -col2-
включительно. Строка -prompt- выводится в этой же области.

*************************************************************)

END strEditor.
